package jers.impl;

import java.io.Serializable;
import java.rmi.RemoteException;

import jers.Callback;
import jers.JERS;
import jers.Result;
import jers.util.Utility;

/**
 * Classe que implementa a interface {@link Callback}.
 * <p>
 * Esta espera um objeto {@link Runnable} contendo a implementacao 
 * para o metodo {@link #run()} e deve ser implementar a interface
 * {@link Serializable}. Ao executar o metodo {@link #call(Result)}, 
 * esta ignora o seu parametro pois a interface alvo nao possui esse
 * returso.
 * </p>
 * 
 * @see {@link SystemFactory}, {@link Callback}
 * 
 * @author 
 * 		<a href="mailto:felipe.zappala@gmail.com">
 * 			Luis Felipe Zappala
 * 		</a> [ <a href="http://lncc.br/ist">ISTCC-P</a> / 2009 ]
 */
public class RemoteCallback implements Callback {

	/** O ID serial da versao */
	private static final long serialVersionUID = -7925647457569882241L;

	/** A Callback real a ser executada. */
	private final Runnable callback;
	
	/**
	 * O construtor padrao do objeto {@link RemoteCallback}.
	 * 
	 * @param 
	 * 		job - A instancia de um objeto {@link Runnable} 
	 * 			  e {@link Serializable}.
	 * 			 
	 */
	public RemoteCallback(Runnable callback) {
		if (callback == null) {
			throw new IllegalArgumentException("The callback is null");
		}
		if (!(callback instanceof Serializable)) { 
			throw new IllegalArgumentException(
					"The callback is not serializable");
		}
		this.callback = callback;
	}
	
	public void call(Result  res) throws RemoteException {
		JERS.log.error("[RemoteCallbackDecorator] Ignoring parameters: ", res);
		this.callback.run();
	}

	/**
	 * Retorna uma representacao {@link String} do objeto.
	 * <p>
	 * <b>Formato:</b><br>
	 * 		<code>ClassName{attributeA:valueA,...,attributeN:valueN}</code>
	 * </p>
	 * @return 
	 * 		A representacao {@link String} do objeto.
	 */
	@Override
	public String toString() {
		return Utility.toString(this);
    }
	
}
